#ifndef _REAL_MD_SPI_H_
#define _REAL_MD_SPI_H_

#include "common.h"

class CRealApp;
class CCtpCntIf;

class CRealMdSpi : public CThostFtdcMdSpi
{
public:
    CRealMdSpi(CThostFtdcMdApi* api, CRealApp* pApp, CCtpCntIf* pCtpCntIf);

	///错误应答
	virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo,
		int nRequestID, bool bIsLast);

	///当客户端与交易后台通信连接断开时，该方法被调用。当发生这个情况后，API会自动重新连接，客户端可不做处理。
	///@param nReason 错误原因
	///        0x1001 网络读失败
	///        0x1002 网络写失败
	///        0x2001 接收心跳超时
	///        0x2002 发送心跳失败
	///        0x2003 收到错误报文
	virtual void OnFrontDisconnected(int nReason);
		
	///心跳超时警告。当长时间未收到报文时，该方法被调用。
	///@param nTimeLapse 距离上次接收报文的时间
	virtual void OnHeartBeatWarning(int nTimeLapse);

	///当客户端与交易后台建立起通信连接时（还未登录前），该方法被调用。
	virtual void OnFrontConnected();
	
	///登录请求响应
	virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin,	CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);

	///登出请求响应
	virtual void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);

	///订阅行情应答
	virtual void OnRspSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);

	///取消订阅行情应答
	virtual void OnRspUnSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);

	///深度行情通知
	virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData);

public:
	//登录行情
	int ReqUserLogin(TThostFtdcBrokerIDType	brokerId,
	        TThostFtdcUserIDType	userId,	TThostFtdcPasswordType	passwd);

	//登出请求
	int ReqUserLogout(TThostFtdcBrokerIDType	brokerId, TThostFtdcUserIDType	userId);

	//订阅行情
	int SubscribeMarketData(vector<string> strInstList);

	//取消行情订阅
	int UnSubscribeMarketData(vector<string> strInstList);

	//判断是否出错消息
	bool IsErrorRspInfo(CThostFtdcRspInfoField *pRspInfo);

private:
    CThostFtdcMdApi* m_pUserApi;
	CRealApp* m_pRealApp;
	CCtpCntIf* m_pCtpCntIf;

	//API输出信息的提示符
	string m_Prompt;    

public:
	//投资者是否成功登录
	bool m_bSuccessLogin;

public:
	vector<CThostFtdcDepthMarketDataField> m_DepthMarketDataList;

};

#endif
